/*
 * Copyright (C) 2016 alchemystar, Inc. All Rights Reserved.
 */
package com.eblly.meta;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @Author eblly
 * <p>
 * CREATE TEMPORARY TABLE `COLUMNS` (
 * `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
 * `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
 * `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
 * `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
 * `ORDINAL_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
 * `COLUMN_DEFAULT` longtext,
 * `IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
 * `DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
 * `CHARACTER_MAXIMUM_LENGTH` bigint(21) unsigned DEFAULT NULL,
 * `CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL,
 * `NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL,
 * `NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL,
 * `DATETIME_PRECISION` bigint(21) unsigned DEFAULT NULL,
 * `CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,
 * `COLLATION_NAME` varchar(32) DEFAULT NULL,
 * `COLUMN_TYPE` longtext NOT NULL,
 * `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
 * `EXTRA` varchar(30) NOT NULL DEFAULT '',
 * `PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
 * `COLUMN_COMMENT` varchar(1024) NOT NULL DEFAULT ''
 * ) ENGINE=MyISAM DEFAULT CHARSET=utf8
 */
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class Column {
    private String tableSchema;
    private String tableName;
    private String columnName;

    private int ordinalPosition;
    private String columnDefault;
    private String isNull;

    /**
     * CHARACTER_SET_NAME
     */
    private String characterSetName;
    private String columnType;
    private String columnKey;

    private String comment;
    private String extra;

//    @Override
//    public boolean equals(Object o) {
//        if (this == o) {
//            return true;
//        }
//
//        if (o == null || getClass() != o.getClass()) {
//            return false;
//        }
//
//        Column column = (Column) o;
//
//        if (tableSchema != null ? !tableSchema.equals(column.tableSchema) : column.tableSchema != null) {
//            return false;
//        }
//
//        if (tableName != null ? !tableName.equals(column.tableName) : column.tableName != null) {
//            return false;
//        }
//
//        if (columnName != null ? !columnName.equals(column.columnName) : column.columnName != null) {
//            return false;
//        }
//
//        if (ordinalPosition != column.getOrdinalPosition()) {
//            return false;
//        }
//
//        if (columnDefault != null ? !columnDefault.equals(column.columnDefault) : column.columnDefault != null) {
//            return false;
//        }
//
//        if (columnName != null ? !columnName.equals(column.columnName) : column.columnName != null) {
//            return false;
//        }
//
//        if (isNull != null ? !isNull.equals(column.isNull) : column.isNull != null) {
//            return false;
//        }
//
//        if (characterSetName != null ? !characterSetName.equals(column.characterSetName) : column.characterSetName != null) {
//            return false;
//        }
//
//        if (columnType != null ? !columnType.equals(column.columnType) : column.columnType != null) {
//            return false;
//        }
//
//        if (columnKey != null ? !columnKey.equals(column.columnKey) : column.columnKey != null) {
//            return false;
//        }
//
//        if (comment != null ? !comment.equals(column.comment) : column.comment != null) {
//            return false;
//        }
//        if (extra != null ? !extra.equals(column.extra) : column.extra != null) {
//            return false;
//        }
//
//        return true;
//    }
//
//    /**
//     * i.如果该域是boolean类型，则计算(f?1:0),
//     * ii.如果该域是byte,char,short或者int类型,计算(int)f,
//     * iii.如果是long类型，计算(int)(f^(f>>>32)).
//     * iv.如果是float类型，计算Float.floatToIntBits(f).
//     * v.如果是double类型，计算Double.doubleToLongBits(f),然后再计算long型的hash值
//     * vi.如果是对象引用，则递归的调用域的hashCode，如果是更复杂的比较，则需要为这个域计算一个范式，然后针对范式调用hashCode，如果为null，返回0
//     * vii. 如果是一个数组，则把每一个元素当成一个单独的域来处理。
//     *
//     * @return
//     */
//    @Override
//    public int hashCode() {
//        int result = 0;
//        result = 31 * result + (tableSchema != null ? tableSchema.hashCode() : 0);
//        result = 31 * result + (tableName != null ? tableName.hashCode() : 0);
//        result = 31 * result + (columnName != null ? columnName.hashCode() : 0);
//        result = 31 * result + (Integer.valueOf(ordinalPosition) != null ? ordinalPosition : 0);
//        result = 31 * result + (columnDefault != null ? columnDefault.hashCode() : 0);
//        result = 31 * result + (isNull != null ? isNull.hashCode() : 0);
//
//        result = 31 * result + (characterSetName != null ? characterSetName.hashCode() : 0);
//        result = 31 * result + (columnType != null ? columnType.hashCode() : 0);
//        result = 31 * result + (columnKey != null ? columnKey.hashCode() : 0);
//
//        result = 31 * result + (comment != null ? comment.hashCode() : 0);
//        result = 31 * result + (extra != null ? extra.hashCode() : 0);
//        return result;
//    }

}
